﻿//辅助:jquery合并数组的方法
function merge(first, second) {
    var l = second.length,
        i = first.length,
        j = 0;

    if (typeof l === "number") {
        for (; j < l; j++) {
            first[i++] = second[j];
        }
    } else {
        while (second[j] !== undefined) {
            first[i++] = second[j++];
        }
    }

    first.length = i;

    return first;
}


(function (window, undefined) {
    var core_version = "spring v.1",
        core_deletedIds = [],
        core_push = core_deletedIds.push,
        core_slice = core_deletedIds.slice;
    var jQuery = function (selector) {
        return new jQuery.fn.init(selector);
    };
    jQuery.fn = jQuery.prototype = {
        jquery: core_version,//jquery版本
        constructor: jQuery,//覆盖构造函数防止被外部改变
        init: function (selector) {//context,rootjQuery不传了,稍微看看就懂了
            //针对不同参数类型进行不同处理方式,如果$("")$(null就直接返回)
            if (!selector) {
                //参数不对直接将this返回，想想现在this的值是什么,提示:new init();=>jQuery.fn.init[0]
                return this;
            } else {
                //如果是字符串juqery会调用查询方法进行查询dom元素(jquery调用sizzle专门进行dom解析)
                var nodes = document.getElementsByName(selector);
                var arr = [];
                for (var i = 0; i < nodes.length; i++) {
                    arr.push(nodes[i]);
                }
                //如果传递了Context上下文，则在context中寻找元素。这里指定位document
                this.context = document;
                this[0] = document;
                //把selector存到jQuery中
                this.selector = selector;
                //jquery的合并方法，直接拿出来就能用，合并查询结果
                var result = merge(this, arr);
                //对处理过的this进行封装返回，注意为了链式调用，都需要返回this
                return result;
            }
        },
        selector: "",
        length: 0,
        toArray: function () {
            return core_slice.call(this);
        },
        get: function (num) {
            return num == null ?
                this.toArray() :
                (num < 0 ? this[this.length + num] : this[num]);
        },
        //这里要注意，想要长得像jquery.fn.jquery.init[0],并且init方法中的this值为数组就必须加下面这三个字段
        push: core_push,
        sort: [].sort,
        splice: [].splice
    }
    //jquery对象级别的扩展插件，看看就明白是啥了
    jQuery.fn.css = function (className) {
        //注意this是一个对象，length值是手动赋予的
        for (var i = 0; i < this.length; i++) {
            var item = this[i];//通过下标找元素，this不是数组
            item.setAttribute("class", className);
        }
        return this;//链式调用返回this
    };
    //jquery静态方法扩展，即类级别扩展
    jQuery.extend = jQuery.fn.extend = function () {
        var src, copy, options, target = this;
        ////arguments[0] 如{a:function(){},b:funciton(){}},一个参数对象
        if ((options = arguments[0]) != null) {
            for (var name in options) {
                copy = options[name];
                target[name] = copy;//其实jquery就是把这些参数取出来，然后一个个复制到jquery这个object中
                //如 var Person=function(){};Person.ajax=function(){}一样
            }
        }
    };
    jQuery.fn.init.prototype = jQuery.fn;
    if (typeof window === "object" && typeof window.document === "object") {
        window.jQuery = window.$ = jQuery;
    }
}(window));
//对象级别的扩展插件
$.fn.attr = function (name, value) {
    for (var i = 0; i < this.length; i++) {
        var item = this[i];
        if (name && value) {
            item.setAttribute(name, value);
        } else if (name && !value) {
            return item.getAttribute(name);
        }
    }
    return this;
};
$("age").attr("class", 'fntest');
console.log($("age").attr("name"));
/*****调用演示******/
//函数级别的扩展插件
$.extend({
    ajax: function () {
        console.log("模拟执行ajax");
    },
    load: function () {
        console.log("模拟执行load");
    }
});
$.ajax();